home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
Graphics
/
Misc
/
Capture
/
Source
/
Grab20.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
8KB
|
350 lines
// You may freely copy, distribute and reuse the code in this example.
// The author disclaims any warranty of any kind, expressed or implied,
// as to its fitness for any particular use.
// Grab20 and Capture written by Peter Eisch.
/* Generated by Interface Builder */
#import "Grab20.h"
#import "other.h"
#import <appkit/Application.h>
#import <appkit/Button.h>
#import <appkit/Listener.h>
#import <appkit/Speaker.h>
#import <appkit/SavePanel.h>
#import <appkit/Slider.h>
#import <appkit/graphics.h>
#import <appkit/nextstd.h>
#import <dpsclient/wraps.h>
#import <objc/List.h>
#import <streams/streams.h>
#import <sys/timeb.h>
#import <appkit/Panel.h>
#import <defaults/defaults.h>
@implementation Grab20
- drawSelf:(const NXRect *)rects :(int)count
{
[super drawSelf:rects :count];
NXSetColor(NX_COLORRED);
PSrectstroke(grabRect.origin.x,
grabRect.origin.y,
grabRect.size.width,
grabRect.size.height);
return self;
}
- setCount:sender
{
[field setIntValue:[frameSlider intValue]];
return self;
}
- begin:sender
{
int i;
NXRect region, area;
time_t myTime;
id list, spanel;
char tmp[255];
int count = [frameSlider intValue];
int imageWidth = [width intValue];
int imageHeight = [height intValue];
int originx = [x intValue];
int originy = [y intValue];
[startGrab setStringValue:""];
[stopGrab setStringValue:""];
[startWrite setStringValue:""];
[stopWrite setStringValue:""];
if ((imageWidth <= 0) || (imageHeight <= 0)) {
NXRunAlertPanel("No Region",
"You need to select a region to grab.",
NULL,NULL,NULL);
return self;
}
list = [[List alloc] initCount:count];
region.size.width = imageWidth;
region.size.height = imageHeight;
region.origin.x = 0.0;
region.origin.y = 0.0;
area.size.width = region.size.width;
area.size.height = region.size.height;
area.origin.x = originx;
area.origin.y = originy;
for (i = 0; i < count; i++) {
[list addObject:[[NXImage alloc] initSize:®ion.size]];
}
[startGrab setStringValue:"Building Speed Cache"];
for (i = 0; i < count; i++) {
id image = [list objectAt:i];
if ([image lockFocus])
[image unlockFocus];
else NXLogError("problem locking focus on %i\n", i);
}
myTime = time(0);
sprintf(tmp, "%s", ctime(&myTime));
[startGrab setStringValue:tmp];
for (i = 0; i < count; i++) {
[self grabIn:[list objectAt:i] fromRect:&area toRect:®ion];
}
myTime = time(0);
sprintf(tmp, "%s", ctime(&myTime));
[stopGrab setStringValue:tmp];
spanel = [SavePanel new];
[spanel setRequiredFileType:"anim"];
if ([spanel runModal]) {
char * path;
char dir[255];
char file[255];
char tmpdir[255];
char tmpname[255];
path = (char *)[spanel filename];
sprintf(tmpdir,"/bin/mkdir %s\n", path);
system(tmpdir);
parsePath(path, dir, file);
sprintf(tmpdir, "%s/%s", path, file);
myTime = time(0);
sprintf(tmp, "%s", ctime(&myTime));
[startWrite setStringValue:tmp];
for (i = 0; i < count; i++) {
NXStream * data;
data = NXOpenMemory(NULL, 0, NX_READWRITE);
sprintf(tmpname, "%s.%d.tiff", tmpdir, (i+1));
[[list objectAt:i] writeTIFF:data];
NXSeek(data, 0, NX_FROMSTART);
NXSaveToFile(data, tmpname);
NXCloseMemory(data, NX_FREEBUFFER);
}
myTime = time(0);
sprintf(tmp, "%s", ctime(&myTime));
[stopWrite setStringValue:tmp];
if ([open state]) {
int ok;
[[NXApp appSpeaker] setSendPort:NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
[[NXApp appSpeaker] openFile:[spanel filename] ok:&ok];
if (!ok) {
NXRunAlertPanel(NULL, "Couldn't open %s", NULL, NULL, NULL, [spanel filename]);
}
}
}
[list freeObjects];
[list free];
return self;
}
- appDidInit:sender
{
[self start:self];
[self display];
return self;
}
- appDidBecomeActive:sender
{
[self start:self];
[self display];
return self;
}
+ initialize /* save compile and test it. make sure the NXReadDefault() stuff is correct. document the code */
{
const NXDefaultsVector CaptureDefaults = {
{ MAX_X, "590" },
{ MAX_Y, "492" },
{ MAX_WIDTH, "640"},
{ MAX_HEIGHT, "480" },
{ NULL, NULL }
};
NXRegisterDefaults([NXApp appName], CaptureDefaults);
return self;
}
- update:sender
{
int maxX = atoi(NXReadDefault([NXApp appName], MAX_X));
int maxY = atoi(NXReadDefault([NXApp appName], MAX_Y));
int maxWid = atoi(NXReadDefault([NXApp appName], MAX_WIDTH));
int maxHei = atoi(NXReadDefault([NXApp appName], MAX_HEIGHT));
int val = [sender intValue];
int tg = [sender tag];
switch(tg) {
case 0:
if (val > maxWid) val = maxWid;
if (val < 0) val = 0;
break;
case 1:
if (val > maxHei) val = maxHei;
if (val < 0) val = 0;
break;
case 2:
if (val > maxX) val = maxX;
if (val < 0) val = 0;
break;
case 3:
if (val > maxY) val = maxY;
if (val < 0) val = 0;
break;
}
[sender setIntValue:val];
if ([x intValue] < 0) [x setIntValue:0];
if ([x intValue] > maxWid) [x setIntValue:maxWid];
if ([y intValue] < 0) [y setIntValue:0];
if ([y intValue] > maxHei) [y setIntValue:maxHei];
if ([width intValue] > (maxWid - [x intValue]))
[width setIntValue:(maxWid - [x intValue])];
if ([height intValue] > (maxHei - [y intValue]))
[height setIntValue:(maxHei - [y intValue])];
[horiSlide setIntValue:[y intValue]];
[vertSlide setIntValue:[x intValue]];
[widSlide setIntValue:[width intValue]];
[heiSlide setIntValue:[height intValue]];
NXSetRect(&grabRect,
[x floatValue], [y floatValue],
[width floatValue], [height floatValue]);
[self display];
return self;
}
- mouseDown:(NXEvent *)theEvent
{
NXEvent anEvent = *theEvent;
NXPoint point1 = theEvent->location,point2;
int oldMask;
BOOL dragged = NO;
[self convertPoint:&point1 fromView:nil];
oldMask = [window addToEventMask:NX_LMOUSEDRAGGEDMASK];
while(anEvent.type != NX_MOUSEUP) {
NXGetOrPeekEvent(DPSGetCurrentContext(),
&anEvent, NX_MOUSEUPMASK|NX_LMOUSEDRAGGEDMASK,NX_FOREVER,10,0);
if (anEvent.type == NX_MOUSEDRAGGED) {
dragged = YES;
point2 = anEvent.location;
[self convertPoint:&point2 fromView:nil];
if (point1.x < point2.x) {
grabRect.origin.x = point1.x;
grabRect.size.width = point2.x - point1.x;
} else {
grabRect.origin.x = point2.x;
grabRect.size.width = point1.x - point2.x;
}
if (point1.y < point2.y) {
grabRect.origin.y = point1.y;
grabRect.size.height = point2.y - point1.y;
} else {
grabRect.origin.y = point2.y;
grabRect.size.height = point1.y - point2.y;
}
NXIntersectionRect(&bounds, &grabRect);
[x setIntValue:(int)grabRect.origin.x];
[y setIntValue:(int)grabRect.origin.y];
[width setIntValue:(int)grabRect.size.width];
[height setIntValue:(int)grabRect.size.height];
[self display];
}
}
if(!dragged) NXSetRect(&grabRect,0.0,0.0,0.0,0.0);
[horiSlide setIntValue:(int)grabRect.origin.x];
[vertSlide setIntValue:(int)grabRect.origin.y];
[widSlide setIntValue:(int)grabRect.size.width];
[heiSlide setIntValue:(int)grabRect.size.height];
[x setIntValue:[horiSlide intValue]];
[y setIntValue:[vertSlide intValue]];
[width setIntValue:[widSlide intValue]];
[height setIntValue:[heiSlide intValue]];
[self display];
[window setEventMask:oldMask];
return self;
}
- updateHori:sender
{
[x setIntValue:[sender intValue]];
grabRect.origin.x = [sender floatValue];
[self display];
return self;
}
- updateVert:sender
{
[y setIntValue:[sender intValue]];
grabRect.origin.y = [sender floatValue];
[self display];
return self;
}
- updateWid:sender
{
[width setIntValue:[sender intValue]];
grabRect.size.width = [sender floatValue];
[self display];
return self;
}
- updateHei:sender
{
[height setIntValue:[sender intValue]];
grabRect.size.height = [sender floatValue];
[self display];
return self;
}
- windowWillResize:sender toSize:(NXSize *)frameSize
{
if (frameSize->width > 661) frameSize->width = 661;
if (frameSize->height > 531) frameSize->height = 531;
return self;
}
- changeIn:sender
/*
* to set the video in
*/
{
[self selectInput:([[in selectedCell] tag] + 1)];
return self;
}
- initFrame:(const NXRect *)dRect
{
[super initFrame:dRect];
NXSetRect(&grabRect, 296.0, 216.0, 48.0, 48.0);
return self;
}
@end